package Negocio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Observable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name = "envios_por_destino")
public class EnviosXDestino extends Observable implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 3965422376525932112L;

	@Id
	@Column(name = "envio_por_destino_id")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int envioXDestinoId;

	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn( name = "envio_por_destino_id" )
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<Envio> envios;
	
	@ManyToOne
	@JoinColumn(name = "sucursal_destino_id")
	@LazyCollection(LazyCollectionOption.FALSE)
	private Sucursal sucursalDestino;
	@Column(name = "peso_acumulado_kg")
	private Float pesoAcumuladoKG;
	@Column(name = "volumen_acumulado_m3")
	private Float volumenAcumuladoM3;
	@Column(name = "primer_fecha_entrega")
	private Date primerFechaEntrega = null;

	public EnviosXDestino(Sucursal sucursalDestino) {
		super();
		this.sucursalDestino = sucursalDestino;
		this.envios = new ArrayList<Envio>();
		this.pesoAcumuladoKG = Float.parseFloat("0");
		this.volumenAcumuladoM3 = Float.parseFloat("0");
		this.primerFechaEntrega = null;
	}

	public Float getPesoAcumuladoKG() {
		return pesoAcumuladoKG;
	}

	public void setPesoAcumuladoKG(Float pesoAcumuladoKG) {
		this.pesoAcumuladoKG = pesoAcumuladoKG;
	}

	public Float getVolumenAcumuladoM3() {
		return volumenAcumuladoM3;
	}

	public void setVolumenAcumuladoM3(Float volumenAcumuladoM3) {
		this.volumenAcumuladoM3 = volumenAcumuladoM3;
	}

	public Date getPrimerFechaEntrega() {
		return primerFechaEntrega;
	}

	public void setPrimerFechaEntrega(Date primerFechaEntrega) {
		this.primerFechaEntrega = primerFechaEntrega;
	}

	public void setSucursalDestino(Sucursal sucursalDestino) {
		this.sucursalDestino = sucursalDestino;
	}

	public EnviosXDestino() {
	}

	public List<Envio> getEnvios() {
		return envios;
	}

	public void setEnvios(List<Envio> envios) {
		this.envios = envios;
	}

	public Sucursal getSucursalDestino() {
		return sucursalDestino;
	}

	public void agregarPaquete(Envio envio) {
		envios.add(envio);
		// actualiozo contadores
		this.pesoAcumuladoKG += envio.getCarga().getPesoKG();
		this.volumenAcumuladoM3 += envio.getCarga().getVolumenM3();
		// la fecha del paquete se mantiene desde la Sucursal, por eso no
		// actualizo fechas.

		// notify Observer
		setChanged();
		notifyObservers("Nuevo Envio");

	}

	public boolean isRefrigerado() {
		boolean refrigerado = false;
		if (!this.envios.isEmpty()) {
			return this.envios.get(0).getCarga().getRefrigerado() == 1;
		}
		return refrigerado;
	}

	public void liberar() {
		this.envios.clear();
		this.pesoAcumuladoKG = Float.parseFloat("0");
		this.volumenAcumuladoM3 = Float.parseFloat("0");
	}

}
